package com.scr1pt.extension

/**
 * 说明: 字符扩展
 *
 * 创建者: tum0r
 *
 * 时间: 2021/12/28 17:05
 */

/**
 * 计算字符Hash
 *
 * @param[hash] 上次计算的Hash值
 * @param[p] 素数乘数
 * @param[mod] 结果的模数
 */
@JvmOverloads
fun Char.getHash(hash: Long = 0, p: Long = 2333, mod: Long = Long.MAX_VALUE): Long = (hash * p + this.code) % mod

/**
 * 计算字符Hash
 *
 * @param[hash] 上次计算的Hash值
 * @param[p] 素数乘数
 * @param[mod] 结果的模数
 */
@JvmOverloads
fun Char.getHash(hash: Int = 0, p: Int = 2333, mod: Int = 1000000007): Int = this.getHash(hash.toLong(), p.toLong(), mod.toLong()).toInt()

/**
 * 计算字符双Hash
 *
 * @param[hash] 上次计算的Hash值
 * @param[p] 素数乘数
 * @param[mod1] 结果1的模数
 * @param[mod2] 结果2的模数
 */
@JvmOverloads
fun Char.getHash2(hash: LongArray = LongArray(2), p: Long = 2333, mod1: Long = Long.MAX_VALUE, mod2: Long = 2147483647): LongArray {
    hash[0] = this.getHash(hash[0], p, mod1)
    hash[1] = this.getHash(hash[1], p, mod2)
    return hash
}

/**
 * 计算字符双Hash
 *
 * @param[hash] 上次计算的Hash值
 * @param[p] 素数乘数
 * @param[mod1] 结果1的模数
 * @param[mod2] 结果2的模数
 */
@JvmOverloads
fun Char.getHash2(hash: IntArray = IntArray(2), p: Int = 2333, mod1: Int = 1000000007, mod2: Int = 2147483647): IntArray {
    val temp = this.getHash2(longArrayOf(hash[0].toLong(), hash[1].toLong()), p.toLong(), mod1.toLong(), mod2.toLong())
    hash[0] = temp[0].toInt()
    hash[1] = temp[1].toInt()
    return hash
}